package urjc.as.emergencies.data;



import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.xml.bind.annotation.XmlAttribute;

import com.thoughtworks.xstream.XStream;



public class BaseEntity {
	


	// ///////////////// ATRIBUTOS
	
	/**
	 * URI de la entidad
	 */
	private String uri;

	


	// ///////////////// CONSTRUCTORES
	
	/**
	 * Constructor por defecto.
	 */
	public BaseEntity() {
		super();
	}
	





	// ///////////////// GETTERS AND SETTERS
	
	/**
	 * Devuelve la URI asignada a la entidad.
	 */
	@XmlAttribute(name = "uri")
	public String getUri() {
		return uri;
	}
	


	/**
	 * Establece la URI con que será referenciada ésta entidad.
	 */
	public void setUri(String uri) {
		this.uri = uri;
	}
	


	



	


	// ///////////////// MÉTODOS XML
	
	/**
	 * Devuelve una representación en XML de la entidad.
	 * 
	 * @return Una cadena de XML formateada que representa la entidad o null si
	 *         hubiese algún error.
	 */
	public String serializar() {
		XStream xstream = new XStream();
		String xml = xstream.toXML(this);
		return xml;
	}
	


	/**
	 * Devuelve una entidad a partir de una representación en XML o null si
	 * sucede algún error en la deserialización.
	 * 
	 * @param XML
	 *            Representación válida de una entidad de la aplicación
	 * @return Un objeto java o null si ocurrió algún error.
	 */
	public static Object deserializar(String s) {
		Object obj = null;
		XStream xstream = new XStream();
		obj = xstream.fromXML(s);
		return obj;
	}
	


	// ///////////////// OTROS MÉTODOS
	
	/**
	 * Codifica la cadena especificada utilizando el algoritmo de resumen MD5.
	 * 
	 * @param data
	 *            El mensaje
	 * @return El resumen MD5 del mensaje
	 * @see http://en.wikipedia.org/wiki/MD5
	 */
	public static String digest(String data) {
		try {
			MessageDigest md5 = MessageDigest.getInstance("MD5");
			md5.update(data.getBytes());
			byte[] result = md5.digest();
			
			// return new String(result);
			StringBuffer sb = new StringBuffer();
			for (int i = 0; i < result.length; i++) {
				String s = Integer.toHexString(result[i]);
				int length = s.length();
				if (length >= 2)
					sb.append(s.substring(length - 2, length));
				else {
					sb.append("0");
					sb.append(s);
				}
			}
			return sb.toString();
		}
		catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			System.err.println("Ocurrió una excepción mientras calculaba el código MD5");
			return null;
		}
	}
	
}
